package com.siss.tenancy.user.utils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>描述:TODO</p>
 * <p>创建人: liyp</p>
 * <p>类名: GetPropertyByModelUtil</p>
 * <p>创建时间: 2018/12/3 18:02</p>
 * <p>@version 2.0  </p>
 * <p>修改内容: ......</p>
 * <p>修改说明: ......</p>
 * <p>修改时间: ......</p>
 * <p>修改人: ......</p>
 * <p>每次修改，请增加上述修改信息说明</>
 */
public class GetPropertyByModelUtil {

    /**
     *
     * 功能描述：获取指定类集合的某个指定类的属性值
     * 作   者： liyp
     * 创建时间： 2018/12/3 18:16
     * 参数: [model, clazz, clasz]  
     *  返回值： java.util.List<K>
     */
    public static <K,T> List<K> getPropertyValueReturnList(List<T> models,Class<K> clazz,Class<T> clasz,String property) throws Exception{
        if(null == models || models.size()<=0){
            return  null;
        }
        //属性名字

        Field [] fieds = clasz.getDeclaredFields();
        Field propertyField = getFieldByProperty(property,fieds);
        if(null == propertyField){
            throw new NullPointerException("field为null，未能根据属性名称获取对应的field");
        }
        K k = null;
        Object o = null;
        List<K> list = new ArrayList<>(models.size());
        for (T t: models) {
            o = propertyField.get(t);
            if(o == null){
                list.add(null);
            }else{
                k = (K)o;
                list.add(k);
            }
        }
        return list;
    }

    /**
     *
     * 功能描述：获取试题对应的属性
     * 作   者： liyp
     * 创建时间： 2018/12/4 10:17
     * 参数: [model, clazz, clasz, property]  
     *  返回值： K
     */
    public static <K,T> K getPropertyValue(T model,Class<K> clazz,Class<T> clasz,String property) throws Exception{
        Field [] fieds = clasz.getDeclaredFields();
        Field propertyField = getFieldByProperty(property,fieds);
        if(null == propertyField){
            throw new NullPointerException("field为null，未能根据属性名称获取对应的field");
        }
        Object o =  propertyField.get(model);
        if(null == o){
            return null;
        }
        return (K)o;
    }

    /**
     *
     * 功能描述：根据属性名获取对应的field
     * 作   者： liyp
     * 创建时间： 2018/12/4 10:12
     * 参数: [property, fields]  
     *  返回值： java.lang.reflect.Field
     */
    public static Field getFieldByProperty(String property,Field[] fields){
        Field propertyField = null;
        String name = null;
        for(Field field : fields){
            //打开私有访问
            field.setAccessible(true);
            name = field.getName();
            if(name.equals(property)){
                propertyField  = field;
            }
        }
        return propertyField;
    }
}
